import axios from 'axios'
import {urlConfig} from './config'

let type = process.env.VUE_APP_API_ENV ==='dev'? 'dev':'production'
let url = urlConfig

const codeMessage = {
  200: '服务器成功返回请求的数据。',
  201: '新建或修改数据成功。',
  202: '一个请求已经进入后台排队（异步任务）。',
  204: '删除数据成功。',
  400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
  401: '用户没有权限（令牌、用户名、密码错误）。',
  403: '用户得到授权，但是访问是被禁止的。',
  404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除，且不会再得到的。',
  422: '当创建一个对象时，发生一个验证错误。',
  500: '服务器发生错误，请检查服务器。',
  502: '网关错误。',
  503: '服务不可用，服务器暂时过载或维护。',
  504: '网关超时。',
};

const request = axios.create({
  baseURL: url[type],
  timeout: 8000,
  headers: {'Content-Type': 'application/x-www-form-urlencoded'},
})

/**
 * 响应拦截器
 */
request.interceptors.response.use(
  (response) => {
    if(response.config && response.config.manualRes)return
    const data = response.data || {};
    // const { header, body } = data;
    // if(header.rspCode !== 0){
    //   cbdztUtil.Toast.showToast(header.rspDesc, 2000);
    //   // return Promise.reject(header);
    // }
    return data;
  },
  error => {
    const { response } = error;
    if (response && response.status) {
      const errorText = codeMessage[response.status] || response.statusText;
      cbdztUtil.Toast.showToast(errorText, 2000);
    } else if (!response) {
      cbdztUtil.Toast.showToast('网络异常', 2000);
    }

    return Promise.reject(error);
  },
);

function sendRequest(url, params, config = {}){
  const {serviceName, data, method, formateParam, formateRes, hideLoading} = params;
  let requestParam = {
    url,
    method: method || 'post',
    data: formateParam ? formateParam(params) : {
      header: {
        serviceName
      },
      body: data
    },
    ...config
  }
  return new Promise((resolve, reject) => {
    let isFinish = false;
    !hideLoading && setTimeout(() => {
      if(!isFinish)cbdztUtil.Toast.showLoading();
    }, 200);
    request(requestParam).then(res => {
      isFinish = true;
      cbdztUtil.Toast.hideLoading()
      resolve(formateRes ? formateRes(res) : res);
    }).catch(rej => {
      isFinish = true;
      cbdztUtil.Toast.hideLoading();
      reject(rej)
    })
  })
}

export default sendRequest;

// //service test
// export const serviceTest = (params) => {
//   return sendRequest('/serviceTestUrl',{
//     data: params,
//     serviceName: 'serviceName',
//     // method: 'get', //默认'post'
//     // formateParam(param){ //针对请求参数与默认的不一致的情况，return新的数据格式
//     //   return {...param}
//     // }, 
//     // formateRes(res){ //针对返回参数与默认的不一致的情况，return新的数据格式
//     //   return {...res}
//     // }, 
//     // hideLoading： true, //是否隐藏loading， 默认false
//     // manualRes: true //是否完全手动处理返回， 默认false
//   })
// }